#include "../../complib/libtsmp/include/tsmp_api.h"
#include "8021AS_PTP.h"

// OpenSync头
typedef struct
{
    u8 osm_id;               // OSM标识，标识该报文来自哪个端口
    u16 sync_serial_number;  // 序列号，报文序列号，针对同步状态上报报文
    u16 delay_serial_number; // 序列号，测量序列号，针对链路状态上报报文
    u8 reserve[11];          // 保留
} __attribute__((packed)) opensync_header;

typedef struct
{
    tsmp_header tsmp_head;
    opensync_header opensync_head;
    u8 sync_flag;
    u16 count;
    u16 offset;
    u32 cumulativeScaledRateOffset; // 上一级节点的cumulativeScaledRateOffset
    u8 gmtime[10];                  // GM时间
    u8 corrtime[8];                 // 校正域时间
    u8 macrecvtime[10];             // MAC接收时间
    u8 tscrecvtime[10];             // tsc接收时间
    u16 hwdelay;                    // 硬件计算的链路传输时延
    u8 cursyncclk[10];              // tsc接收到的sync同步时钟
    u8 clkset[10];                  // 计算得到的同步时间
    u32 ccid;                       // cyclestar序列号
    u8 tick_len[8];                 // 本地时钟的拍长
} __attribute__((packed)) opensync_sync_state_pkt;

typedef struct
{
    tsmp_header tsmp_head;
    opensync_header opensync_head;
    u32 port_ptp_enabled;
    osm_link_state_info link_state_info[MAX_PORT_NUM];
} __attribute__((packed)) opensync_delay_state_pkt;

int delay_state_pkt_process(sync_context *sync_para_context, u8 *pkt, u8 fre_switch);
int sync_state_pkt_process(sync_context *sync_para_context, u8 *pkt, sync_state_table *state_table, u8 fre_switch);
int synctime_write_file(u16 hcp_mid, u8 *pkt, u16 seq_num);